//
//  HomeTableViewController.swift
//  glzbowei
//
//  Created by 高伦展 on 2017/11/17.
//  Copyright © 2017年 glz. All rights reserved.
//

import UIKit
import SVProgressHUD

//原创微博 Cell 的可重用标识符号
 let StatusCellNormalId = "StatusCellNormalId"
//转发微博的可重用 id
 let StatusCellRetweetedId = "StatusCellRetweetedId"

class HomeTableViewController: VisitorTableViewController {

    private lazy var listViewModel = StatusListViewModel()

//    //微博数据数组
//    var dataList :[Status]?
    
    override func viewDidLoad() {
        super.viewDidLoad()

        if !UserAccountViewModel.sharedUserAccount.userLogin{
            visitorView?.setupInfo(imageName: nil, title: "关注一些人，回这里看看有什么惊喜")
            return
        }
        
        prepareTableView()
        
        loadData()
        
        //注册通知
        NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: WBStatusSelectedPhotoNotification), object: nil, queue: nil) { [weak self] (n) in
            
            guard let urls = n.userInfo?[WBStatusSelectedPhotoURLsKey] as? [URL] else {
                return
            }
            guard let indexPath = n.userInfo?[WBStatusSelectedPhotoIndexPathKey] as? IndexPath else {
                return
            }
            
            guard let cell = n.object as? PhotoBrowserPresentDelegate else{
                return
            }
            
            let vc = PhotoBrowserViewController(urls: urls, indexPath: indexPath)
            
            vc.modalPresentationStyle = UIModalPresentationStyle.custom
            
            vc.transitioningDelegate = self?.photoBrowserAnimator
            
            self?.photoBrowserAnimator.setDelegateParams(presentDelegate: cell, indexPath: indexPath, dismissDelegate: vc)
            
            self?.present(vc, animated: true, completion: nil)
        }
    }
    
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
    
    //准备表格
    private func prepareTableView()
    {
        tableView.register(StatusNormalCell.self, forCellReuseIdentifier: StatusCellNormalId)
        tableView.register(StatusRetweetedCell.self, forCellReuseIdentifier: StatusCellRetweetedId)
   
        //取消分割线
        tableView.separatorStyle = .none
        
        //自动计算行高 - 需要一个自上而下的自动布局控件，指定一个向下的约束
        tableView.estimatedRowHeight = 400
        //tableView.rowHeight = UITableViewAutomaticDimension
        
        //下拉刷新控件默认没有
        refreshControl = WBRefreshControl()
        //添加监听方法
        refreshControl?.addTarget(self, action: #selector(HomeTableViewController.loadData), for:UIControlEvents.valueChanged)
        
        //上拉刷新视图
        tableView.tableFooterView = pullupView
    }
    
    //加载数据
    @objc private func loadData(){
        
        self.refreshControl?.beginRefreshing()
        listViewModel.loadStatus(isPullup: pullupView.isAnimating) { (isSuccessed) in
            
            //关闭刷新控件
            self.refreshControl?.endRefreshing()
            //关闭上拉刷新
            self.pullupView.stopAnimating()
            
            if !isSuccessed {
                SVProgressHUD.showInfo(withStatus: "加载数据错误，请稍后再试")
                return
            }
            
            //显示下拉刷新提示
            self.showPulldownTip()
            
            self.tableView.reloadData()
        }
    }
    
    //显示下拉刷新
    private func showPulldownTip(){
        guard let count = listViewModel.pulldownCount else {
            return
        }
        
        QL1("下拉刷新 \(count)")
        pulldownTipLabel.text = (count == 0) ? "没有新微博" : "刷新到\(count)条微博"
        
        let height:CGFloat = 44
        let rect = CGRect(x: 0, y: 0, width: view.bounds.width, height: height)
        pulldownTipLabel.frame = CGRect.offsetBy(rect)(dx: 0, dy: -2 * height)
        
        UIView.animate(withDuration: 1.0, animations: {
            self.pulldownTipLabel.frame = CGRect.offsetBy(rect)(dx: 0, dy: height)
        }) { (_) in
            UIView.animate(withDuration: 1.0, animations: { 
                self.pulldownTipLabel.frame = CGRect.offsetBy(rect)(dx: 0, dy: -2 * height)
                
            })
        }
    }
    
    private lazy var pulldownTipLabel:UILabel = {
        let label = UILabel(title: "", fontSize: 18, color: UIColor.white)
        label.backgroundColor = UIColor.orange
        
        self.navigationController?.navigationBar.insertSubview(label, at: 0)
        
        return label
    }()
    
    private lazy var pullupView:UIActivityIndicatorView={
        let indicator = UIActivityIndicatorView(activityIndicatorStyle:.whiteLarge)
        //indicator.startAnimating()
        indicator.color = UIColor.gray
        return indicator
    }()
    //照片查看转场代理
    private lazy var photoBrowserAnimator:PhotoBrowserAnimator = PhotoBrowserAnimator()
}

extension HomeTableViewController{
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return listViewModel.statusList.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let vm = listViewModel.statusList[indexPath.row]
        
        let cell = tableView.dequeueReusableCell(withIdentifier: vm.cellId, for: indexPath) as! StatusCell
        
        cell.viewModel = vm
        
        if indexPath.row == listViewModel.statusList.count - 1 && !pullupView.isAnimating {
            pullupView.startAnimating()
            loadData()
        }
        
        return cell
    }
    
 
     /**
     行高
     
     -- 设置了预估行高
     * 当前显示的行高方法会调用三次（每个版本的Xcode调用次数可能不同）
     
     问题：预估行高如果不同，计算的次数不同！
     
     1. 使用预估行高，计算出预估的 contentSize
     2. 根据预估行高，判断计算次数，顺序计算每一行的行高，更新 contentSize
     3. 如果预估行高过大，超出预估范围，顺序计算后续行高，一直到填满屏幕退出，同时更新 contentSize
     4. 使用预估行高，每个 cell 的显示前需要计算，单个 cell 的效率是低的，从整体效率高！
     
     执行顺序 行数 -> 每个[cell -> 行高]
     
     预估行高：尽量靠近！
     
     -- 没设置了预估行高
     * 1. 计算所有行的高度
     * 2. 再计算显示行的高度
     
     执行顺序 行数 -> 行高 -> cell
     
     问题：为什么要调用所有行高方法？UITableView 继承自 UIScrollView
     表格视图滚动非常流畅 -> 需要提前计算出 contentSize
     
     苹果官方文档有指出，如果行高是固定值，就不要实现行高代理方法！
     
     实际开发中，行高一定要缓存！
     */
     
 
    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        
//        print("计算行高 \(indexPath)")
//        
//        let vm =  listViewModel.statusList[indexPath.row]
//        
//        if vm.rowHeight != nil{
//            return vm.rowHeight!
//        }
//        
//        let cell = StatusCell(style: .default, reuseIdentifier: StatusCellNormalId)
//        
//        vm.rowHeight = cell.rowHeight(vm: vm)
//        
//        return vm.rowHeight!
        
        return listViewModel.statusList[indexPath.row].rowHeight
    }
}
